package edu.mju.Reflect;

import java.lang.reflect.Method;

public class TestPersonService2 {

	public static void main(String[] args) {
		TestPersonService2 test1 = new TestPersonService2();
		PersonServiceImpl2 p1 = test1.getInstance();
		p1.sayHello();
		System.out.println("-----------------");
		TestPersonService2 test2 = new TestPersonService2();
		PersonServiceImpl2 p2 = (PersonServiceImpl2)test2.reflectMethod(new PersonServiceImpl2(),"info","男");
	}

	/**
	 * 反射生成对象
	 * @return PersonServiceImpl2()对象
	 */
	public  PersonServiceImpl2 getInstance() {
		//创建一个空的PersonServiceImpl2对象
		PersonServiceImpl2 object = null;
		try {
			//Class.forName：类加载器注册PersonServiceImpl2类
			//newInstance: 返回类的新分配的实例（对象）
			object = (PersonServiceImpl2)Class.forName("edu.mju.Reflect.PersonServiceImpl2").getConstructor(String.class,Integer.class).newInstance("Person2的name",22);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return object;
		
	}

	/**
	 *
	 * @param target 反射的对象
	 * @param methodName 反射对象的方法名
	 * @param sex 方法中的参数
	 * @return 反射后的对象
	 */
	public Object reflectMethod(Object target,String methodName,String sex) {
		try {
			//1. 当知道具体哪个类的时候：
			// Method method = PersonServiceImpl.class.getMethod(methodName, String.class);
			//2.当不知道具体哪个类的时候
			Method method = target.getClass().getMethod(methodName, String.class);
			method.invoke(target, sex);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		return target ;
	}

}
